package www.ld.com.utils;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import www.ld.com.domain.dto.user.UserInfoDTO;
import www.ld.com.exception.ValidateException;

/**
 * 权限获取工具类
 */
public class SecurityUtils {
    /**
     * 获取Authentication
     * @return
     */
    public static org.springframework.security.core.Authentication getAuthentication()
    {
        return SecurityContextHolder.getContext().getAuthentication();
    }

    /**
     * 获取用户
     */
    public static String getUsername()
    {
        return getPersonalInfo().getUsername();
    }

    /**
     * 获取用户Id
     * @return
     */
    public static Long getUserId()
    {
        return  Long.valueOf(getPersonalInfo().getId());
    }
    /**
     * 获取用户
     */
    public static UserInfoDTO getPersonalInfo(Authentication authentication)
    {
        Object principal = authentication.getPrincipal();
        if (principal instanceof UserInfoDTO)
        {
            return (UserInfoDTO) principal;
        }
        return null;
    }

    /**
     * 生成BCryptPasswordEncoder密码
     *
     * @param password 密码
     * @return 加密字符串
     */
    public static String encryptPassword(String password)
    {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        return passwordEncoder.encode(password);
    }

    /**
     * 判断密码是否相同
     *
     * @param rawPassword 真实密码
     * @param encodedPassword 加密后字符
     * @return 结果
     */
    public static boolean matchesPassword(String rawPassword, String encodedPassword)
    {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        return passwordEncoder.matches(rawPassword, encodedPassword);
    }
    /**
     * 获取用户
     */
    public static UserInfoDTO getPersonalInfo()
    {
        Authentication authentication = getAuthentication();
        if (authentication == null)
        {
            throw  new ValidateException("获取用户信息失败！");
        }
        return getPersonalInfo(authentication);
    }





}
